// Encoding documentation
// https://en.wikipedia.org/wiki/MSI_Barcode#Character_set_and_binary_lookup

import Barcode from '../Barcode.js';

class MSI extends Barcode {
  constructor(data, options) {
    super(data, options);
  }

  encode() {
    // Start bits
    var ret = '110';

    for (var i = 0; i < this.data.length; i++) {
      // Convert the character to binary (always 4 binary digits)
      var digit = parseInt(this.data[i]);
      var bin = digit.toString(2);
      bin = addZeroes(bin, 4 - bin.length);

      // Add 100 for every zero and 110 for every 1
      for (var b = 0; b < bin.length; b++) {
        ret += bin[b] == '0' ? '100' : '110';
      }
    }

    // End bits
    ret += '1001';

    return {
      data: ret,
      text: this.text,
    };
  }

  valid() {
    return this.data.search(/^[0-9]+$/) !== -1;
  }
}

function addZeroes(number, n) {
  for (var i = 0; i < n; i++) {
    number = '0' + number;
  }
  return number;
}

export default MSI;
